Typical computing systems include volatile memory such as random-access memory (RAM) coupled to persistent data storage such as hard disk drives or solid-state drives. Volatile memory requires a power source for operation; the contents of volatile memory may be lost when the power supply to a computing system is turned off. Persistent, or nonvolatile, storage retains its contents while power to the computing system is turned off.
Some computing systems include persistent memory, which may be byte-addressable, high-performance, nonvolatile memory. Persistent memory may provide performance comparable to traditional volatile random access memory (RAM) while also providing data persistence. Computing systems may use persistent memory for program execution.
Executable code may be “position independent,” meaning that the code may execute properly when mapped to different virtual address ranges. The virtual address range assigned to an executable may be determined at compile time, at runtime, or in a combination of compile time and runtime. For example, a shared library may be mapped to a different virtual address range when linked to an executable. As another example, application-global data such as externally accessible functions and global data may be mapped to different virtual addresses based on changes to application source code. In some computing devices, executable code may be mapped to a different, sometimes random, virtual address range on every execution. For example, address space layout randomization (ASLR) is a computer security technique that may provide protection against buffer overflow attacks. Operating systems such as OS X, Linux, and Android 4.0 provide ASLR to help protect system and third party applications from exploits due to memory-management issues.